package com.zjl.redis.第19章_IO多路复用;

/**
 * Java 一切皆对象   Redis 一切皆文件
 *
 * 数据通信系统或计算机网络系统中，传输媒体的带宽或容量往往会大于传输单一信号的需求，
 * 为了有效地利用通信线路,希望一个信道同时传输多路信号，这就是所谓的多路复用技术。
 * 采用多路复用技术能把多个信号组合起来在一条物理信道上进行传输，
 * 在远距离传输时可大大节省电缆的安装和维护费用。
 * 频分多路复用FDM (Frequency Division Multiplexing)和时分多路复用TDM (Time Division Multiplexing)
 * 是两种最常用的多路复用技术。
 *
 * I/O多路复用在英文中其实叫 I/O multiplexing
 *          多个Socket复用一根网线这个功能是在内核+驱动层实现的
 * I/O multiplexing这里面的multiplexing指的其实是在单个线程通过记录跟踪每一个Sock(I/O流)的状态来同时管理多个I/O流.
 * 目的是尽量多的提高服务器的吞吐能力。
 *
 *
 * 大家都用过nginx，nginx使用epoll接收请 求，nginx会 有很多链接进来，
 * epoll会 把他们都监视起来，然后像拨开关一样， 谁有数据就拨向谁，然后调用相应的代码处理。
 *
 * redis 类似同理
 *
 * 文件描述符(File descriptor)是计算机科学中的一个术语，是一个用于表述指向文件的引用的抽象化概念。
 * 文件描述符在形式上是一个非负整数，实际上，它是一个索引值，指向内核为每一个进程所维护的该进程打开文件的记录表。
 * 当程序打开一个现有文件或者创建一个新文件时，内核向进程返回一个文件描述符。
 * 在程序设计中，一些涉及底层的程序编写往往会围绕着文件描述符展开。
 * 但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。
 *
 * IO multiplexing就是我们说的select, poll, epoll, 有些技术书籍也称这种IO方式为event driven I0事件驱动IO。
 * 就是通过一种机制，一个进程可以监视多个描述符，一旦某个描述符就绪(一般是读就绪或者写就绪)，能够通知程序进行相应的读写操作。
 * 可以基于一个阻塞对象并同时在多个描述符上等待就绪，而不是使用多个线程(每个文件描述符一个线程， 每次new一个线程)，
 * 这样可以大大节省系统资源。
 * 所以，I/O多路复用的特点是通过一种机制一个进程能同时等待多个文件描述符而这些文件描述符(套接字描述符)
 * 其中的任意一个进入读就绪状态 select，poll, epoll等函数就可以返回。
 *
 *
 * Redis服务采用Reactor的方式来实现文件事件处理器(每一个网络连接 其实都对应一个 文件描述符)
 * 所谓I/O多路复用机制，就是说通过一种机制，可以监视多个描述符，一旦某个描述符就绪(一般是读就绪或写就绪)，
 * 能够通知程序进行相应 的读写操作。
 * 这种机制的使用需要select、poll 、epoll 来配合。
 * 多个连接共用一个阻塞对象，应用程序只需要在一个阻塞对象上等待，无需 阻塞等待所有连接。
 * 当某条连接有新的数据可以处理时，操作系统通知应用程序，线程从阻塞状态返回，开始进行业务处理。
 *
 */
public class E1_Redis的IO多路复用 {

}
